package com.jacob.androidstudy.javanote;

/**
 * 内部类的四种形式:
 * 1. 成员式（定义在类的内部，和域、方法平级）
 *    1.1 静态内部类
 *    1.2 成员内部类
 * 2. 局部式（定义在方法内部）
 *    2.1 局部内部类
 *    2.2 匿名内部类
 *    
 * 使用内部类的几种情况：
 * 1. 需要在一个类中，访问另一个类的private成员。（内部类可以访问外部类的private成员）
 * 2. 内部类可以对同一个包中的其他类隐藏起来。
 * 3. 某个类的对象依赖于另一个类的对象。
 * 
 */
public class $12_内部类 {
	private static int 静态域;
	private int 域;
	private static void 静态方法() {}
	private void 方法() {}
	
	/**
	 * 静态内部类
	 * 只能访问外部类的静态成员。（用“成员名”或“外部类名.成员名”访问）
	 */
	public static class 静态内部类 {
		public void 方法() {
			
//			生成静态内部类对象。生成静态内部类对象前, 不需要生成外部类对象。
			$12_内部类.静态内部类 sic1 = new $12_内部类.静态内部类();
			
//			静态内部类中，只能访问外部类的静态域和静态方法。
			int a = $12_内部类.静态域+1;
			$12_内部类.静态方法();
		}
	}
	
	
	/**
	 * 成员内部类
	 * 可以访问外部类的所有成员。
	 * 静态成员用“成员名”或“外部类名.成员名”访问，非静态成员用“外部类名.this.成员名”访问。
	 * 生成成员内部类对象前，要先生成外部类对象。
	 */
	public class 成员内部类 {
		
		public void 方法() {
			
//			生成成员内部类对象。
//			生成成员内部类对象前, 需要先生成外部类对象。用“外部类对象.new 成员内部类()”生成成员内部类对象。
			$12_内部类 outClass = new $12_内部类();
			$12_内部类.成员内部类 mIC = outClass.new 成员内部类();
			
//			成员内部类中，可以访问外部类的静态与非静态成员。
			int a = $12_内部类.静态域+1;
			int b = $12_内部类.this.域+1;
			$12_内部类.静态方法();
			$12_内部类.this.方法();
			
		}
	}
	
	/**
	 * 局部内部类！！！！！有点复杂，需要看书总结！！！！！
	 * 1. 定义在外部类的方法中，只有在这个方法中才能使用。
	 * 2. 局部内部类
	 */
	private void 局部内部类() {
		class ic3 {
			
			public void 方法() {
				int a = 域+1;
			}
		}
	}
	
	/**
	 * 匿名内部类
	 * 
	 */
	private void 匿名内部类() {
		new $12_内部类() {
			
		};
	}

}
